#ifndef VL_NODE_PROP__H_
#define VL_NODE_PROP__H_

#include <cstdint>
#include "vl_prop.h"

namespace VL {

/**
 * @Author: CimZzz
 * @Date: 2022-06-21 11:16:36
 * 
 * 叶子结点属性
 */
class NodeProp : public VLProp {
public:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 11:17:04
	 * 
	 * 构造方法
	 */
	explicit NodeProp();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 11:18:02
	 * 
	 * 有参构造方法
	 * @param value 值指针
	 */
	explicit NodeProp(const std::shared_ptr<std::string>& value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 11:18:02
	 * 
	 * 有参构造方法
	 * @param value 值指针
	 */
	explicit NodeProp(const std::string& value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 14:28:16
	 * 
	 * 有参构造方法
	 * @param value 字符串
	 */
	explicit NodeProp(const char * value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 11:18:02
	 * 
	 * 有参构造方法
	 * @param value 布尔值
	 */
	explicit NodeProp(const bool& value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 18:45:07
	 * 
	 * 有参构造方法
	 * 
	 * @param value 字节
	 */
	explicit NodeProp(const int8_t& value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 18:45:07
	 * 
	 * 有参构造方法
	 * 
	 * @param value 无符号字节
	 */
	explicit NodeProp(const uint8_t& value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 18:45:07
	 * 
	 * 有参构造方法
	 * 
	 * @param value 短整型
	 */
	explicit NodeProp(const int16_t& value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 18:45:07
	 * 
	 * 有参构造方法
	 * 
	 * @param value 无符号短整型
	 */
	explicit NodeProp(const uint16_t& value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 11:18:02
	 * 
	 * 有参构造方法
	 * @param value 整数值
	 */
	explicit NodeProp(const int32_t& value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 11:18:02
	 * 
	 * 有参构造方法
	 * @param value 无符号整数值
	 */
	explicit NodeProp(const uint32_t& value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 11:18:02
	 * 
	 * 有参构造方法
	 * @param value 长整型
	 */
	explicit NodeProp(const int64_t& value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 11:18:02
	 * 
	 * 有参构造方法
	 * @param value 无符号长整型
	 */
	explicit NodeProp(const uint64_t& value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 18:59:36
	 * 
	 * 设置值
	 * @param value 值
	 */
	void setValue(const std::string & value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 11:18:37
	 * 
	 * 设置值
	 * @param valuePtr 值指针
	 */
	void setValue(std::string* valuePtr);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 11:19:05
	 * 
	 * 设置值
	 * @param valuePtr 值指针
	 */
	void setValue(std::shared_ptr<std::string> valuePtr);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:46:46
	 * 
	 * 设置布尔值
	 * @param boolean 布尔值
	 */
	void setValue(const bool& boolean);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 18:47:47
	 * 
	 * 设置字节
	 * @param value 字节
	 */
	void setValue(const int8_t& value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 18:48:05
	 * 
	 * 设置无符号字节
	 * @param value 无符号字节
	 */
	void setValue(const uint8_t& value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 18:47:47
	 * 
	 * 设置短整型
	 * @param value 短整型
	 */
	void setValue(const int16_t& value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 18:48:05
	 * 
	 * 设置无符号短整型
	 * @param value 无符号短整型
	 */
	void setValue(const uint16_t& value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:46:22
	 * 
	 * 设置整数值
	 * @param number 整数值
	 */
	void setValue(const int32_t& number);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 18:48:05
	 * 
	 * 设置无符号整型
	 * @param value 无符号整型
	 */
	void setValue(const uint32_t& value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:46:22
	 * 
	 * 设置长整数值
	 * @param number 长整数值
	 */
	void setValue(const int64_t& number);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 18:48:05
	 * 
	 * 设置无符号长整型
	 * @param value 无符号长整型
	 */
	void setValue(const uint64_t& value);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 19:13:35
	 * 
	 * 二次解析字符串为对应值
	 */
	void parseStrValue();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-27 14:35:29
	 * 
	 * 获取属性值
	 * @return 属性值
	 */
	virtual std::string getValue();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:48:21
	 * 
	 * 获取布尔值, 缺省为 false
	 * 
	 * @param defaultValue 缺省值
	 * 
	 * @return 布尔值
	 */
	bool getBoolean(bool defaultValue = false);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 18:29:21
	 * 
	 * 获取字节, 缺省值为 0
	 * 
	 * @param defaultValue 缺省值
	 * 
	 * @return 字节值
	 */
	int8_t getByte(int8_t defaultValue = 0);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 18:28:22
	 * 
	 * 获取无符号字节, 缺省值为 0
	 * 
	 * @param defaultValue 缺省值
	 * 
	 * @return 无符号字节
	 */
	uint8_t getUByte(uint8_t defaultValue = 0);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 14:31:11
	 * 
	 * 获取短整型, 缺省值为 0
	 * 
	 * @param defaultValue 缺省值
	 * 
	 * @return 短整型
	 */
	int16_t getShort(int16_t defaultValue = 0);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 14:31:11
	 * 
	 * 获取无符号短整型, 缺省值为 0
	 * 
	 * @param defaultValue 缺省值
	 * 
	 * @return 无符号短整型
	 */
	uint16_t getUShort(uint16_t defaultValue = 0);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:49:16
	 * 
	 * 获取整数值, 缺省为 0
	 * 
	 * @param defaultValue 缺省值
	 * 
	 * @return 整数值
	 */
	int32_t getInt(int32_t defaultValue = 0);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 14:27:01
	 * 
	 * 获取无符号整数值, 缺省为 0
	 * 
	 * @param defaultValue 缺省值
	 * 
	 * @return 整数值
	 */
	uint32_t getUInt(uint32_t defaultValue = 0);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 18:30:14
	 * 
	 * 获取长整型, 缺省值为 0
	 * 
	 * @param defaultValue 缺省值
	 * 
	 * @return 长整型
	 */
	int64_t getLong(int64_t defaultValue = 0);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 18:31:34
	 * 
	 * 获取无符号长整型, 缺省值为 0
	 * 
	 * @param defaultValue 缺省值
	 * 
	 * @return 无符号长整型
	 */
	uint64_t getULong(uint64_t defaultValue = 0);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:50:02
	 * 
	 * 判断是否为整数
	 * 
	 * @return 如果是返回 true
	 */
	bool isInt();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 14:24:28
	 * 
	 * 判断是否为无符号整数
	 * 
	 * @return 如果是无符号整数返回 true
	 */
	bool isUInt();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:50:22
	 * 
	 * 判断是否为布尔值
	 * 
	 * @return 如果是返回 true
	 */
	bool isBoolean();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:50:58
	 * 
	 * 判断是否为字符串
	 * 
	 * @return 如果是返回 true
	 */
	bool isString();
	
	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-30 18:22:06
	 * 
	 * 比较两个 Array 之间的区别
	 * @param prop 属性指针
	 * @return 如果相同返回 true
	 */
	virtual bool diff(VLProp* prop);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 11:04:46
	 * 
	 * 构建属性打印信息
	 */
	virtual std::string buildPropPrintInfo();

private:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:38:24
	 * 
	 * 值类型
	 */
	enum PropValueType {
		// 空值
		Void,
		// 布尔值
		Boolean,
		// 字符串
		String,
		// 字节
		Byte,
		// 无符号字节
		UByte,
		// 短整型
		Short,
		// 无符号短整型
		UShort,
		// 整数
		Int,
		// 无符号整数
		UInt,
		// 长整型
		Long,
		// 无符号长整型
		ULong,
	};

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 17:51:55
	 * 
	 * 友元类
	 */
	friend class RootProp;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 11:39:11
	 * 
	 * 属性值
	 */
	std::shared_ptr<void> propValue;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:39:40
	 * 
	 * 值类型
	 */
	PropValueType valueType;
};

}

#endif // VL_NODE_PROP__H_
